package com.ddshuai.easy;

import java.util.Objects;
import java.util.Stack;

/**
 * 描述 新通教育
 *
 * @author ddshuai
 * @date 2018-09-30 下午3:36
 * <p>
 * 给定 S 和 T 两个字符串，当它们分别被输入到空白的文本编辑器后，判断二者是否相等，并返回结果。 # 代表退格字符。
 * <p>
 * 示例 1：
 * 输入：S = "ab#c", T = "ad#c"
 * 输出：true
 * 解释：S 和 T 都会变成 “ac”。
 * <p>
 * 示例 2：
 * 输入：S = "ab##", T = "c#d#"
 * 输出：true
 * 解释：S 和 T 都会变成 “”。
 * <p>
 * 示例 3：
 * 输入：S = "a##c", T = "#a#c"
 * 输出：true
 * 解释：S 和 T 都会变成 “c”。
 * <p>
 * 示例 4：
 * 输入：S = "a#c", T = "b"
 * 输出：false
 * 解释：S 会变成 “c”，但 T 仍然是 “b”。
 * <p>
 * 提示：
 * <p>
 * 1 <= S.length <= 200
 * 1 <= T.length <= 200
 * S 和 T 只含有小写字母以及字符 '#'。
 **/

@SuppressWarnings("ALL")
public class BackspaceCompare {

    /**
     * 效率低下 27.74% 17ms 104用例
     * @param S
     * @param T
     * @return
     */
    public static boolean backspaceCompare(String S, String T) {
        Stack<String> stack = new Stack<>();
        for (char c : S.toCharArray()) {
            stack.add(String.valueOf(c));
        }
        stack.add("/");
        for (char c : T.toCharArray()) {
            stack.add(String.valueOf(c));
        }
        StringBuilder pureS = new StringBuilder();
        StringBuilder pureT = new StringBuilder();
        StringBuilder current = pureT;
        int ignore = 0;
        while (!stack.isEmpty()) {
            String bz = stack.pop();
            if (Objects.equals(bz, "/")) {
                current = pureS;
                ignore = 0;
            } else {
                if (Objects.equals(bz, "#")) {
                    ignore++;
                } else {
                    if (ignore > 0) {
                        ignore--;
                    } else {
                        current.append(bz);
                    }
                }
            }
        }

        return Objects.equals(pureS.reverse().toString(), pureT.reverse().toString());
    }

    public static boolean backspaceCompare1(String S, String T) {
        char[] s = S.toCharArray();
        char[] t = T.toCharArray();
        if (s.length > t.length){
            return backspaceCompare1(s,t);
        }
        return backspaceCompare1(t,s);
    }

    private static boolean backspaceCompare1(char[] s, char[] t) {
        int ignores = 0;
        int ignoret = 0;

        for (int i = s.length -1; i >=0 ; i--) {
            if (s[i] == '#'){
                ignores++;
                s[i] = ' ';
            }else {
                if (ignores>0){
                    s[i] = ' ';
                    ignores--;
                }
            }

            if (i<t.length){
                if (t[i] == '#'){
                    ignoret++;
                    t[i] = ' ';
                }else {
                    if (ignoret>0){
                        t[i] = ' ';
                        ignoret--;
                    }
                }
            }
        }

        return Objects.equals(String.valueOf(s).replace(" ",""),String.valueOf(t).replace(" ",""));
    }

    /**
     * 性能最好的 9ms
     * @param S
     * @param T
     * @return
     */
    public static boolean backspaceCompare2(String S, String T) {
        for (int i = S.length() - 1, j = T.length() - 1; ; i--, j--) {
            for (int b = 0; i >= 0 && (b > 0 || S.charAt(i) == '#'); --i) {
                b += S.charAt(i) == '#' ? 1 : -1;
            }
            for (int b = 0; j >= 0 && (b > 0 || T.charAt(j) == '#'); --j) {
                b += T.charAt(j) == '#' ? 1 : -1;
            }
            if (i < 0 || j < 0 || S.charAt(i) != T.charAt(j)) {
                return i == -1 && j == -1;
            }
        }
    }



    public static void main(String[] args) {
        System.out.println(backspaceCompare2("ab#c","ad#c"));
//        System.out.println(backspaceCompare2("ab##","c#d#"));
//        System.out.println(backspaceCompare2("a##c","#a#c"));
//        System.out.println(backspaceCompare2("a#c","b"));
//        System.out.println(backspaceCompare2("xywrrmp","xywrrmu#p"));
    }

}
